package org.atlantis.grosbeak.castor;


import java.lang.reflect.Type;

import org.atlantis.grosbeak.lang.Mirror;

/**
 * 所有类型转换器的父类。<br>
 * 继承此类可以不用手动写getFrom和getTo方法，因为此类通过反射机制来自动获取FROM和TO两个泛型的类型。<br>
 * <font color="#FF0000"> <b>特别注意：</b><br>
 * 如果FROM、TO中存在泛型类型（如List&lt;String&gt;、Set&lt;String&gt;……）
 * 那么转换器会忽略泛型直接按照声明此泛型类型的类或接口（如List 、Set……）来
 * 进行转型。如下面两种转换器框架会做同样处理（只不过添加到转换器容器中时，后一种会替换前一种）：
 * <ol>
 * <li>public String2IntList implements Castor&lt;String,
 * List&lt;Integer&gt;&gt;{...}</li>
 * <li>public String2StrList implements Castor&lt;String,
 * List&lt;String&gt;&gt;{...}</li>
 * </ol>
 * </font>
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 * @param <FROM>
 *            需要转换的类型。
 * @param <TO>
 *            转换到的类型。
 */
public abstract class AbstractCastor<FROM, TO> implements Castor<FROM, TO> {

	private Type from;
	private Type to;

	protected AbstractCastor() {
		/*
		 * 1.原来from和to都是Class类型，但是后来发现当from或to中有数组时会出现ClassCastException。因为
		 * 数组是GenericArrayType类型，不是Class类型。所以如果要把数组转换成Class就会抛出类型转换异常。
		 * 
		 * 2.通过Mirror.getClassRawType方法来消除泛型参数。
		 */
		Type[] types = Mirror.getClassTypes(getClass());
		from = Mirror.getClassRawType(types[0]);
		to = Mirror.getClassRawType(types[1]);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.atlantis.grosbeak.castor.Castor#getFrom()
	 */
	public Type getFrom() {
		return from;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.atlantis.grosbeak.castor.Castor#getTo()
	 */
	public Type getTo() {
		return to;
	}
}
